package collection;

import java.util.ArrayList;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;

//验证ArrayList是线程不安全的
public class NotSafeArrayList {

    public static void main(String[] args) {

        //创建ArrayList集合类对象
        //ArrayList<String> list = new ArrayList<>();
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        //Exception in thread "19" java.util.ConcurrentModificationException
        /*
        1、故障现象：
                java.utl.concurrentModificationException
        2、导致出现原因
            对个线程同时对同一个list进行增加的操作，list中的方法没有加同步，不能够保证线程安全
        3、解决方案
            1、使用Vector<>()替代，效率低
            2、使用Collections.synchronizedList(new ArrayList<String>());
            3、使用CopyOnWriteArrayList 读写分离
                CopyOnWriteArraySet<>();
                CopyOnWriteMap<>();
                ConcurrentHashMap<>();


                public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }
        4、优化建议
         */
        for(int i = 1; i <= 50; i++) {

            new Thread(() -> {
            //线程执行方法语句
             list.add(UUID.randomUUID().toString().substring(0, 6));

                System.out.println("线程" + Thread.currentThread().getName() + list);

            },String.valueOf(i)).start();
          }
    }
}
